package com.example.kotlin.aspect

import android.app.Activity
import android.app.Fragment
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkInfo
import android.util.Log
import android.view.View
import android.widget.Toast
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Pointcut
import org.aspectj.lang.reflect.MethodSignature

/**
 * Created by hcDarren on 2017/8/27.
 * 处理切点
 */
@Aspect
open class SectionAspect {
    /**
     * 找到处理的切点
     * * *(..)  可以处理所有的方法
     */
    @Pointcut("execution(@com.example.KotlinApplication.aspect.CheckNet * *(..))")
    private fun checkNetBehavior() {
    }

    /**
     * 处理切面
     */
    @Around("checkNetBehavior()")
    @Throws(Throwable::class)
    open fun checkNet(joinPoint: ProceedingJoinPoint): Any? {
        Log.e("TAG", "checkNet")
        // 做埋点  日志上传  权限检测（我写的，RxPermission , easyPermission） 网络检测
        // 网络检测
        // 1.获取 CheckNet 注解  NDK  图片压缩  C++ 调用Java 方法
        val signature = joinPoint.signature as MethodSignature
        val checkNet = signature.method.getAnnotation(CheckNet::class.java)
        if (checkNet != null) {
            // 2.判断有没有网络  怎么样获取 context?
            val `object` = joinPoint.getThis() // View Activity Fragment ； getThis() 当前切点方法所在的类
            val context = getContext(`object`)
            if (context != null) {
                if (!isNetworkAvailable(context)) {
                    // 3.没有网络不要往下执行
                    Toast.makeText(context, "请检查您的网络", Toast.LENGTH_LONG).show()
                    return null
                }
            }
        }
        return joinPoint.proceed()
    }

    /**
     * 通过对象获取上下文
     *
     * @param object
     * @return
     */
    private fun getContext(`object`: Any): Context? {
        if (`object` is Activity) {
            return `object`
        } else if (`object` is Fragment) {
            return `object`.activity
        } else if (`object` is View) {
            return `object`.context
        }
        return null
    }

    companion object {
        /**
         * 检查当前网络是否可用
         *
         * @return
         */
        private fun isNetworkAvailable(context: Context): Boolean {
            // 获取手机所有连接管理对象（包括对wi-fi,net等连接的管理）
            val connectivityManager =
                context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            if (connectivityManager != null) {
                // 获取NetworkInfo对象
                val networkInfo = connectivityManager.allNetworkInfo
                if (networkInfo != null && networkInfo.size > 0) {
                    for (i in networkInfo.indices) {
                        // 判断当前网络状态是否为连接状态
                        if (networkInfo[i].state == NetworkInfo.State.CONNECTED) {
                            return true
                        }
                    }
                }
            }
            return false
        }
    }
}